from django import http
from django.shortcuts import render

# Create your views here.

from django.views import View

from apps.verification.constants import IMAGE_CODE_EXPIRE_TIME, SMS_CODE_EXPIRE_TIME
from libs.yuntongxun.sms import CCP
from utils.response_code import RETCODE

"""
一、我们要把需求写下来（前端要收集什么数据，后端要干什么）
        前端： 通过一个UUID来生成一个key
        后端： 生成图片验证码

二、把后端的思路写下来（把一些能够想到的内容写下来）

        1.生成图片验证码二进制图片和验证码
        2.记录下来（在后台）。
                记录下来的验证码有一个有效期（所以选择redis）
                而且redis存储删除速度快，占用资源少
        3.把图片返回回去


三、 确定请求方式和路由
        GET  image_codes/(?P<uuid>[\w-]+)/


"""

from django_redis import get_redis_connection

class ImageCodeView(View):


    def get(self,request,uuid):

        # 1.生成图片验证码二进制图片和验证码
        from libs.captcha.captcha import  captcha

        # code 是图片验证码  image是图片验证码二进制
        name,code,image = captcha.generate_captcha()


        # 2.记录下来（在后台）。
        #         记录下来的验证码有一个有效期（所以选择redis）
        #         而且redis存储删除速度快，占用资源少
        conn = get_redis_connection('code')
        # conn.setex(key,seconds,value)
        # conn.setex('img:%s' % uuid,120,code)
        conn.setex('img:%s' % uuid,IMAGE_CODE_EXPIRE_TIME,code)

        # 3.把图片返回回去

        # content_type 是告知浏览器，以图片的形式解析
        return http.HttpResponse(image,content_type='image/jpeg')


"""
一、我们要把需求写下来（前端要收集什么数据，后端要干什么）

二、把后端的思路写下来（把一些能够想到的内容写下来）


三、 确定请求方式和路由

"""

import logging
logger = logging.getLogger('django')
class SmsCodeView(View):

    def get(self,request,mobile):

        # 接收手机号，图片验证码，uuid
        # iamge_code 是用户输入的图片验证码
        image_code = request.GET.get('image_code')
        # image_code_id是uuid
        uuid = request.GET.get('image_code_id')

        # 验证数据
        if not all([image_code,uuid]):
            return http.HttpResponseBadRequest('参数不全')
        # 验证用户输入的图片验证码和我们保存的图片验证码是否一致

        # 我们在操作外界资源（mysql，redis，file）的时候，我们最好进行异常捕获
        # 获取redis中的
        try:
            conn = get_redis_connection('code')
            redis_code = conn.get('img:%s'%uuid)
            # 判断是否为空
            if redis_code is None:
                return http.HttpResponseBadRequest('图片验证码已过期')

            if redis_code != image_code:
                return http.HttpResponseBadRequest('图片验证码输入错误')

            # 已经比对过的验证码删除，防止用户重复输入
            conn.delete('img:%s'%uuid)
        except Exception as e:
            logger.error(e)
            return http.HttpResponseBadRequest('redis连接错误')
        # 生成短信内容 6位数字
        from random import randint
        sms_code = '%06d'%randint(0,999999) # 自动补齐

        # 保存短信内容
        # conn.setex(key,senconds,value)
        conn.setex('sms:%s'%mobile,SMS_CODE_EXPIRE_TIME,sms_code)
        # 发送短信
        CCP().send_template_sms('13994523811',[970417,5],1)
        return http.JsonResponse({'code':RETCODE.OK})

